package cn.wp.ewallet.wallet.service;

import cn.wp.common.core.dto.WpResult;
import cn.wp.ewallet.wallet.dao.AccountInfoDao;
import cn.wp.ewallet.wallet.model.dto.AccountInfoDto;
import cn.wp.ewallet.wallet.model.dto.MoneyChangeParamDto;
import cn.wp.ewallet.wallet.model.entity.AccountInfoDo;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;

/**
 * @ClassName AccountInfoService
 * @Author ruixule
 * @Date 2020/1/7 10:47
 */
public interface AccountInfoService extends BaseService<AccountInfoDo> {
    /**
     * 通过钱包地址 、币种类型查询 账号信息（账户余额），可用账户，非理财账户
     *
     * @param walletAddress
     * @param moneyTypeId
     * @return
     */

    AccountInfoDto selectAccountByWalletAddMoneyTypeId(String walletAddress, String moneyTypeId, String accountType);


    /**
     * 保存钱包账户信息
     *
     * @param type
     * @param accountName
     * @param address
     */
    void saveAccountInfoDo(String type, String accountName, String address, String accoutType);

    /**
     * 查询理财总额
     *
     * @param address
     * @param moneyTypeId
     * @return
     */
    BigDecimal selectFinaMoneyAmount(String address, String moneyTypeId);

    /**
     * 转账逻辑
     *
     * @param transferAccountParamDto
     * @return
     */
    WpResult transferMoney(MoneyChangeParamDto transferAccountParamDto);

    /**
     * 充值逻辑
     *
     * @param transferAccountParamDto
     * @return
     */

    WpResult rechargeMoney(MoneyChangeParamDto transferAccountParamDto);


    /**
     * 通过账户id获取该账户的信息(余额)
     *
     * @param AccountId
     * @return
     */
    AccountInfoDo getAccountInfoDoByAccountId(String AccountId);


    /**
     * 根据钱包地址及账户类型查看所对应的账户信息
     *
     * @param walletAddress
     * @return
     */
    AccountInfoDo selectAccountByWalletAddAccountType(String walletAddress, String accountType);

    /**
     * 保存账户信息
     *
     * @param accountInfoDto
     */
    void update(AccountInfoDto accountInfoDto);

    /**
     * 根据账户ID根据账户资产
     *
     * @param accountInfoDto
     */
    void modifyAccountInfoById(AccountInfoDto accountInfoDto);

    /**
     * @param amount        数量
     * @param fromAccountId 转账账户
     * @param toAccountId   到账账户
     * @param moneyTypeId   币种
     */
    void transferAccount(BigDecimal amount, String fromAccountId, String toAccountId, String moneyTypeId);


    /**
     * 根据账户id获取钱包地址
     *
     * @param accountId
     * @return
     */
    String getAddressByAccountId(String accountId);

    /**
     * 保存账户资产变动信息
     *
     * @param address
     * @param tokenBlance
     * @param symbol
     * @param changeCause
     * @param moneyTypeId
     * @param accountType
     */
    void saveAccountChange(String address, BigDecimal tokenBlance, int symbol, String changeCause, String moneyTypeId, String accountType);

    /**
     * 根据账户ID增加收益
     *
     * @param accountId
     * @param dailyEarn
     */
    void increaseMoneyAmount(String accountId, BigDecimal dailyEarn);


    /**
     * 只操作 SHQC 可用
     * 1、发布卖币需求扣除
     * 1-1、下架发布卖币，需要再新增回去
     * 2、卖币扣除
     * 2-1、未收到转账，客服介入，取消交易新增
     * 3、买币成功新增
     * 4、收币成功新增
     *
     * @param accountId 账户ID
     * @param amount    金额，如果是新增，则是整数，如果是扣除则是负数
     */
    void exchange(String accountId, BigDecimal amount);

    /**
     * 获取SHQC可用账户ID
     *
     * @param userId
     * @return
     */
    String shqcAccountId(String userId);
}
